/**
 * 小程序相关权限
 * @param {String} scopeValue - 权限种类，isMessage为订阅消息设置,默认false
 *
 */

const TIPS_MAP = {
  userLocation: "地理位置", //需要在manifest中配置permission。
};

export default class MpAuth {
  constructor(scopeValue) {
    this.scopeValue = scopeValue;
    this.isMessage = scopeValue === "message" ? true : false;
  }

  // 检测当前请求权限是否可用。
  checkAuth() {
    const that = this;
    return new Promise((resolve, reject) => {
      uni.getSetting({
        withSubscriptions: that.isMessage, //是否获取用户订阅消息的订阅状态
        success: (res) => {
          if (!that.isMessage) {
            // 非订阅消息
            if (!res.authSetting[`scope.${this.scopeValue}`]) {
              //用户未请求过此权限，后者用户拒绝了此权限
              uni.authorize({
                //如果没请求过，会弹窗询问。同意过，直接success。此前拒绝，直接fai
                scope: `scope.${this.scopeValue}`,
                success: (res) => {
                  //用户同意
                  console.log(
                    `%c用户同意${TIPS_MAP[this.scopeValue]}权限1`,
                    "color:green;background:yellow"
                  );
                  resolve(1);
                },
                fail: (err) => {
                  //用户拒绝
                  console.log(
                    `%c用户拒绝${TIPS_MAP[this.scopeValue]}权限`,
                    "color:green;background:yellow"
                  );
                  resolve(0);
                  that.setAuth();
                },
              });
            } else {
              //用户同意授权此权限，直接调用接口
              console.log(
                `%c用户同意${TIPS_MAP[this.scopeValue]}权限2`,
                "color:green;background:yellow"
              );
              resolve(1);
            }
          } else {
            //订阅消息 TODO
          }
        },
        fail: (err) => {
          console.log(
            `%cuni.getSetting失败：`,
            "color:green;background:yellow"
          );
          console.log(err);
        },
      });
    });
  }

  // 引导用户开启权限
  setAuth() {
    uni.showModal({
      title: "设置权限",
      content: `当前功能需要${TIPS_MAP[this.scopeValue]}权限，是否开启？`,
      confirmText: "立即授权",
      success: (res) => {
        res.confirm &&
          uni.openSetting({
            success: function (data) {
              console.log("data", data);
            },
          });
      },
      fail: (err) => {
        console.log(`%cuni.showModal失败：`, "color:green;background:yellow");
      },
    });
  }
}
